#ifndef TDASERVIDORINSEGURO_H_
#define TDASERVIDORINSEGURO_H_

#define MAX_CORREOS_SERV 20
#define NO_MESSAGES 1

/* Este TDA representa un servidor que recibe y entrega los correos a traves de un canal inseguro */
/* Salvo en la primitiva de creacion, se asume como PRE para todas las primitivas que el servidor esta creado */
/* En todas las primitivas se asume en forma implicita que el primer parametro es una variable del tipo del TDA */

/* NOTA IMPORTANTE: Para el presente TP1, el servidor almacenara solamente un mensaje de correo */

#include "TDACorreo.h"

/* Definicion del tipo de dato */
typedef struct {
    TDACorreo correo[MAX_CORREOS_SERV];
    int cantidadCorreos;

} TDAServidorInseguro;

/*
 * Crea el servidor
 *
 * Parametros:
 * N/A
 *
 * Valor de retorno:
 * N/A
 *
 * PRE: N/A
 * POST: se ha creado el servidor
 *
 */
void crearServidor(TDAServidorInseguro* servidor);

/*
 * Destruye el servidor
 *
 * Parametros:
 * N/A
 *
 * Valor de retorno:
 * N/A
 *
 * PRE: N/A
 * POST: el servidor se ha destruido (y cualquier correo almacenado se ha eliminado)
 *
 */
void destruirServidor(TDAServidorInseguro* servidor);

/*
 * Agrega un correo a ser entregado por el servidor
 *
 * Parametros:
 * correo	un correo valido a agregar
 *
 * Valor de retorno:
 * 0 si el correo fue agregado exitosamente
 * 1 si el correo no pudo ser agregado
 *
 * PRE: correo es un correo valido
 * POST: el correo se ha agregado al servidor
 *
 */
int agregarCorreo(TDAServidorInseguro* servidor, TDACorreo correo);

/*
 * Obtiene el proximo correo del servidor dirigido al destinatario especificado
 *
 * Parametros:
 * destinatario	un char* que apunta a una cadena de texto con la direccion de correo del destinatario del mensaje a ser obtenido
 * correo		un puntero a una zona de memoria valida con espacio suficiente para contener un correo
 *
 * Valor de retorno:
 * 0 si se ha podido recibir un correo
 * 1 si no habia correos para obtener
 * 2 si ocurrio un error al intentar obtener un correo
 *
 * PRE: destinatario apunta a una zona de memoria valida con espacio suficiente para contener MAX_ADDR_SIZE caracteres y ademas el caracter terminador de cadena
 * 		correo apunta a una zona de memoria valida con especio suficiente para contener un correo
 * POST: se ha recibido un nuevo correo que puede obtenerse a partir del parametro correo provisto
 *
 */
int obtenerProximoCorreo(TDAServidorInseguro* servidor, char* destinatario, TDACorreo* correo);

/*
 * Descripcion: Devuelve los correos no recibidos del destinatario.
 *
 * Precondiciones: Servidor creado, dest es una cadena de caracteres valida de
 * longitud maxima MAX ADDR SIZE, correos es una cola creada para elementos de
 * tamano sizeof(TCorreo).
 *
 * Postcondiciones: Los mensajes no leidos del destinatario fueron puestos en la cola
 * en el mismo orden en que fueron enviados. Se marcaron los mensajes como
 * recibidos por el destinatario.
 *
int obtenerCorreos(TDAServidorInseguro *servidor, char *dest,TCola *correos);
 */

/*
 * Descripcion: Escribe en el archivo un registro de todos los correos electronicos
 * recibidos y entregados por el servidor.
 *
 * Precondiciones: Servidor creado y archivo abierto con permisos de escritura.
 *
 * Postcondiciones: Se escribio en el archivo una linea por cada correo recibido o
 * entregado por el servidor. Ver formato en la seccion siguiente.
 *
 */
int escribirLog(TDAServidorInseguro servidor, FILE* archivo);


#endif /*TDASERVIDORINSEGURO_H_*/
